package com.now.diff;

/**
 * 查分数组类
 */
public class Difference {
  private int[] diff;

  Difference(int[] nums){
    assert nums.length > 0;
    diff = new int[nums.length];
    // 根据初始数组构造差分数组
    diff[0] = nums[0];
    for (int i = 1; i < nums.length; i++) {
      diff[i] = nums[i] - nums[i - 1];
    }
  }

  /**
   * diff[i] += 3 意味着给 nums[i..] 所有的元素都 加了 3，然后 diff[j+1] -= 3 ⼜意味着对于 nums[j+1..] 所有元素再减 3
   * 综合起来，就是对nums[i..j] 中的所有元素都加 3 了
   * @param i
   * @param j
   * @param val
   */
  public void increment(int i,int j,int val){
    diff[i] += val;
    if (j + 1 < diff.length) {
      diff[j + 1] -= val;
    }
  }

  /**
   *  返回结果数组
   *  从差分数组反推
   */
  public int[] result() {
    int[] res = new int[diff.length];
    // 根据差分数组构造结果数组
    res[0] = diff[0];
    for (int i = 1; i < diff.length; i++) {
      res[i] = res[i - 1] + diff[i];
    }
    return res;
  }
}
